public class test1342 {

//    public int numberOfSteps(int num) {
//        int count = 0;
//        if(num == 0){
//            count = 0;
//        }else if(num == 1){
//            count = 1;
//        }else{
//            while (num / 2 != 1) {
//                //当num不为2，3时
//                if (num % 2 != 0) {
//                    //如果num为奇数，则多一步-1的步骤
//                    count++;
//                }
//                num = num / 2;
//                count++;
//            }
//            if(count==2){
//                count+=2;
//            }else{
//                count+=3;
//            }
//        return count ;
//        }

        //上一种的改进，比上一种想到哪写到哪要好
//            int ans = 0;
//            while (num != 0 && ++ans >= 0) num = num % 2 == 0 ? num / 2 : num - 1;
//            return ans;


    //目的是使得最终结果的二进制表示均为 0，两种操作对二进制数的影响分别为「整体右移」和「消减最低位的 1」。
    //
    //因此整个模拟过程其实是：如果当前的 num 最低位不为 1（偶数），则不断进行右移，直到最低位为 1（奇数），然后再对最低位的 1 进行消减，直到二进制表示中的所有 1 均被消减完（结果为 0），模拟过程结束。
    //
    //换句话说，总的操作次数为 = 右移次数 + 消减次数 ：
            public int numberOfSteps(int num) {
                return Math.max(getLoc(num) + getCnt(num), 0);
            }
            int getLoc(int x) {
                for (int i = 31; i >= 0; i--) {
                    //循环右移
                    if (((x >> i) & 1) == 1)
                    //当最右边一位是1时停止
                        return i;
                    //101--i=2
                    //1000--i=3
                }
                return -1; //num为0的情况返回-1
            }
            int getCnt(int x) {
                int ans = 0;
                for (int i = 31; i >= 0; i--) {
                    if (((x >> i) & 1) == 1)
                        //循环加-1次数
                        ans++;
                }
                return ans;
            }
//    }
}
